package com.lj.dict.enums;

import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONUtil;
import com.lj.common.enums.EnumDict;
import com.lj.common.enums.ICommonEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @author luojing
 * @since 2025/1/11 15:30
 * 针对js字典值类型，目前仅支持这四种字典类型
 */
@AllArgsConstructor
@Getter
@EnumDict(name = "DictValueType")
public enum DictValueType implements ICommonEnum<Integer> {
    STRING(1, "String") {
        @Override
        public Object parseValueType(String value) {
            return value;
        }

        @Override
        public boolean isValueType(String value) {
            return true;
        }

    },
    NUMBER(2, "Number") {
        @Override
        public Object parseValueType(String value) {
            return NumberUtil.parseNumber(value);
        }

        @Override
        public boolean isValueType(String value) {
            return NumberUtil.isNumber(value);
        }
    },
    BOOLEAN(3, "Boolean") {
        @Override
        public Object parseValueType(String value) {
            return BooleanUtil.toBooleanObject(value);
        }

        @Override
        public boolean isValueType(String value) {
            return parseValueType(value) != null;
        }
    },
    JSON(4, "Json") {
        @Override
        public Object parseValueType(String value) {
            return JSONUtil.parseObj(value);
        }

        @Override
        public boolean isValueType(String value) {
            try {
                parseValueType(value);
                return true;
            } catch (JSONException e) {
                return false;
            }
        }
    };

    /**
     * 将字符串的值转为前端需要的js类型的值
     *
     * @param value 字符串值
     * @return js类型的值
     */
    public abstract Object parseValueType(String value);

    /**
     * 判断前端传过来的值是否是对应的值类型
     *
     * @param value 前端传过来的值
     * @return 是否是对应的值类型
     */
    public abstract boolean isValueType(String value);

    private final Integer value;
    private final String desc;
}
